<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<script>
// 在JS中一切皆对象
// 所有对象可以分为两种对象: 普通对象和函数对象
// 普通对象: String实例 Number实例 Boolean实例 {} []等
// 函数对象: function

// prototype原型(显式原型)
// 每一个函数对象(除了Function.prototype之外)都有一个prototype属性(属性值是一个对象即原型对象)
// 定义函数后,JS引擎就会给当前函数添加prototype属性,默认值为 {constructor:f}
// prototype的作用: 添加到prototype对象上的属性方法,都将被构造函数的实例对象共享(继承)

// var obj = {}
// var arr = []
// 函数对象的prototype属性
// console.log( obj.prototype );// undefined
// console.log( arr.prototype );// undefined

// var fun = function (){}
// console.log( fun.prototype );// Object 原型对象->普通对象
// console.log( String.prototype );// String  原型对象->普通对象
// console.log( Number.prototype );// Number  原型对象->普通对象
// console.log( Boolean.prototype );//Boolean  原型对象->普通对象
// console.log( Array.prototype );// Array 原型对象->普通对象
// console.log( Object.prototype );// Object 原型对象->普通对象
// console.log( Function.prototype );// Function 原型对象->函数对象!!!
// console.log( Function.prototype.prototype );// undefined

function Cat(n,c){
    this.name = n;
    this.color = c;
}
Cat.prototype.skill = function (){
    console.log( '抓老鼠' );
}
var cat1 = new Cat('小白','black');
var cat2 = new Cat('小黑','white');
console.log( cat1 );// Cat {name: '小白', color: 'black'}
console.log( cat2 );// Cat {name: '小黑', color: 'white'}
cat1.skill();// '抓老鼠'
cat2.skill();// '抓老鼠'

Object.prototype.hehe = '呵呵';
String.prototype.haha = '哈哈';
var str = 'hello';
var num = 123;
var obj = {a:11,b:22};
var arr = [1,2,3];

console.log( str.hehe );// '呵呵'
console.log( num.hehe );// '呵呵'
console.log( obj.hehe );// '呵呵'
console.log( arr.hehe );// '呵呵'

console.log( str.haha );// '哈哈'
console.log( num.haha );// undefined
console.log( obj.haha );// undefined
console.log( arr.haha );// undefined

// 思考:
// 1.为什么上面所有对象都能访问到hehe属性?
// 2.为什么只有str能访问到haha属性?


</script>
</body>
</html>